#ifndef SEMAPHORE_H
#define SEMAPHORE_H

#include <mutex>
#include <condition_variable>

class Semaphore {
private:
    std::mutex mtx;
    std::condition_variable cv;
    int count;  // 信号量计数器

public:
    // 构造函数，初始化信号量计数器
    explicit Semaphore(int initial_count = 0);

    // 禁止拷贝构造和赋值操作
    Semaphore(const Semaphore&) = delete;
    Semaphore& operator=(const Semaphore&) = delete;

    // P操作：获取资源，计数器减1，若为负数则阻塞
    void wait();

    // V操作：释放资源，计数器加1，唤醒一个等待的线程
    void post();

    // 尝试获取资源，若成功返回true，否则立即返回false
    bool try_wait();
};

#endif // SEMAPHORE_H
